[TOC]
1 引言
软件系统的安全特性在系统设计的时候就需要考虑了。
2 安全设计原则
2.1 简单易懂
系统结构越简单清晰,越容易测试和审查,从一定程度上减少安全隐患,降低安全风险。
比如一个设计人员用易经八卦设计了一套系统,后来的开发者大多是一知半解、似懂非懂,结果可想而知,开发者自己都搞不太清楚,系统的安全风险也是一个未知数。
2.2 最小运行特权
只授予程序执行操作所必须的访问权限,并对权限的使用时间范围做限制。
比如无人值守保洁,给保洁人员的钥匙应该是不包含保险柜的,钥匙在保洁完成之后也是要归还的,同时如果觉得钥匙可能被复制,必要的话也要换把锁。
2.3 故障安全化
在系统出现异常或者故障的时候,以安全的方式进行处理或者退出。
比如一个科学家背叛了或者精神状态超出了正常范围,比较好的方式是清除相关的知识和回收相应的权限,阻止进一步的机密泄露,降低安全风险。
2.4 保护最薄弱环节
及时发现并加强系统的薄弱环节,让最薄弱的环节也满足安全需求。
木桶原理,最薄弱的环节代表了系统整体最高的安全系数,动物迁徙的时候,也是对幼崽进行特别的保护。
2.5 提供深度防御
为不同层次的安全需求提供不同的安全限制,并对他们进行权限隔离。
贵重的财物和文件总是放在卧室的保险柜里或者银行的保险柜里,比起直接放在客厅的物品有更深层次的保护。
2.6 分隔安全域
适度对不同业务间的数据进行分隔,控制并减少系统安全隐患带来的损失。
除了大门加锁之外,不同的房间也有各自的锁,杜绝突破了大门的锁就能打开保险柜的情况发生。
2.7 不遗漏任何一次授权
安全验证要作用到每一次需要授权的访问。
安全无小事,每一个需要权限的访问,都应该要有相应的认证和授权机制。
2.8 默认不信任
明确系统功能的访问权限。
不跟陌生人说话,在没有搞清楚情况之前,陌生人都是坏人。
2.9 保护用户隐私
对用户数据按照敏感性分类,并针对不同的敏感性提供相应的保护措施。
网络安全法也规定了,这类事情搞不清楚,就是违法。
2.10 使用业界主流的安全保护方式
使用经过验证的业界普遍使用的数据安全保护方式,比如OpenSSL库。
被普遍使用的方法也是经过普遍认可和验证的方法,即使方法有问题也能很快得到解决,相比起来更加安全。
3 安全编码原则
3.1 保持简单
复杂度高的代码难以全面测试和维护,更容易隐藏安全隐患。
工程上处理问题的方式复杂问题简单化,跟咱们学术上搞的某些事情刚好相反,不给后来的维护者增添麻烦。
3.2 验证输入
验证所有的不受信任的数据输入。
所有的输入都应该被验证,即使前端做了验证,在后端也应该做验证,因为无法保证后端的输入就是来源于前端;同样的其他子系统的输入也无法保证是受信的。
3.3 注意编译器告警
对于编译型代码,用最高的告警级别,并且清除所有的告警。
编译器告警能在一定程度上指出我们对语言的理解和使用的一些疏漏,更容易暴露深层次的问题,比如内存问题。
3.4 框架和设计要复合安全策略
在满足安全需求的情况下,使用合适的框架来处理业务逻辑,使代码结构更清晰。
使用通用的框架比如MVC来实现业务逻辑,分层结构能更容易在处理复杂的业务逻辑时保持结构清晰。
3.5 默认拒绝
对于未识别或者未预料的输入或者权限,默认采用拒绝策略。
不对未知的操作类型进行猜测和赋予默认值,直接不进行任何进一步的操作。
3.6 坚持最小权限原则
给刚好够应用程序运行的权限,一点多余的都不给。
实现要跟设计保持一致,不越权,不赋予无关权限。
3.7 净化发送到其他系统的数据
做好本系统相关的数据验证,并进行安全过滤,降低有害数据对后续系统输入的安全威胁。
在系统入口第一次进行数据校验的时候,对有害数据进行无害化处理,再提供给后续系统输入。
3.8 深度防御
不同系统的输入都要进行校验,默认不信任任何输入。
每一部分的输入都需要进行验证,尤其是破坏力较高的场景,比如注入。
3.9 使用有效的质量保证技术
使用各种自动化扫描和渗透测试工具降低安全隐患,提高代码质量。
每一种锁芯都有一个破解的时间要求,在没有钥匙的情况下,开锁的时间越长,锁芯的安全级别越高,需要禁得住测试。
3.10 采用一个安全编码规范
提供一个内部代码的编码规范,将常见的不安全编码方式排除,降低安全风险。
一个团体一份规范约定,并严格按照约定进行编码,不引人更多的未预料的安全隐患。
4 参考资料
《软件剖析-代码攻防之道》
《Web应用安全威胁与防治 基于OWASP Top 10与ESAPI》
《WEB之困 现代WEB应用安全指南》
《Web应用安全权威指南》
《黑客大曝光Web应用程序安全》第3版
《黑客攻防技术宝典Web实战篇》第2版—《The Web Application Hacker’s Handbook》2nd Edition
-
最后更新: 2022年03月02日 03:32
原始链接: http://rawbin-.github.io/security/2017-05-26-security-web-design-coding/